/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package comunicacao;

import java.io.DataInputStream;
import java.io.IOException;
import jogo.JogoCliente;
import util.Constantes;

/**
 *
 * @author Pablo Viana
 */
public class Cliente extends Thread {
    
    // SINCRONIZACAO COM O SERVIDOR ////////////////////////////////////////////
    private Comunicacao comunicacao;
    private JogoCliente jogoCliente;
    private String nomeUsuario;

    // CONSTRUTOR //////////////////////////////////////////////////////////////
    public Cliente(Comunicacao comunicacao, String nomeUsuario, JogoCliente jogoCliente) {
        this.comunicacao = comunicacao;
        this.jogoCliente = jogoCliente;
        this.nomeUsuario = nomeUsuario;
        System.out.println("Cliente.Cliente();");
    }

    public void run() {
        while (true) {
            try {
                DataInputStream dados = this.pegarStatus();
                int serverStatus = dados.readInt();

                switch (serverStatus) {
                    case Constantes.STATUS_ESPERANDO_INICIAR:
                        boolean estouNoJogo = dados.readBoolean();
                        int conectados = dados.readInt();
                        System.out.println("Cliente.run(): Recebeu do servidor: " + estouNoJogo + "  num = " + conectados);

                        if (estouNoJogo) {
                            this.jogoCliente.atualizarStatusIniciar(dados, conectados);
                        } else if (conectados < 4) {
                            this.comunicacao.entrarNoJogo(this.nomeUsuario);
                        } else {
                            this.naoConseguiConectar();
                        }
                        break;

                    case Constantes.STATUS_ESPERANDO_JOGADA:
                        if (this.jogoCliente.getStatus() == Constantes.STATUS_PROCURANDO_JOGO) {
                            this.naoConseguiConectar();
                        }
                        this.jogoCliente.atualizarStatusJogada(dados);
                        break;
                }
            } catch (IOException e) {
                System.out.println("Cliente.run(): Caiu numa excecao");
                e.printStackTrace();
            }

            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // Ok
            }
        }
    }

    private DataInputStream pegarStatus() throws IOException {
        int rodada = this.jogoCliente.getRodada();
        int partida = this.jogoCliente.getPartida();
        return this.comunicacao.retorneStatus(this.nomeUsuario, partida, rodada);
    } 
        
    private void naoConseguiConectar() {
        this.jogoCliente.acabarJogo();
        this.interrupt();
    }        
      
}
